/*
 * Copyright (c) 2023-2025 elsfs Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.elsfs.cloud.common.mybatis.ext.sql;

import java.util.Collection;
import java.util.Map;
import org.elsfs.cloud.common.core.entity.BaseEntity;

/**
 * 插入SQL
 *
 * @param <C> 子类具体类型
 */
public interface InsertSql<C extends InsertSql<C>> extends SqlFragment {

  /**
   * 插入的表
   *
   * @param entityClass 实体类
   * @return 具体实现
   */
  C insertInto(Class<? extends BaseEntity> entityClass);

  /**
   * 插入的表
   *
   * @param table 表名
   * @return 具体实现
   */
  C insertInto(String table);

  /**
   * 插入的字段
   *
   * @param fields 字段名称列表
   * @return 具体实现
   */
  C fields(String... fields);

  /**
   * 插入的字段
   *
   * @param fields 字段名称枚举列表
   * @return 具体实现
   */
  C fields(Enum<?>... fields);

  /**
   * 插入的字段
   *
   * @param fields 字段名称集合
   * @return 具体实现
   */
  C fields(Collection<String> fields);

  /**
   * 插入的字段
   *
   * @param fields 字段名称枚举集合
   * @return 具体实现
   */
  C fieldsEnum(Collection<Enum<?>> fields);

  /**
   * 插入的值
   *
   * @param value 值Map
   * @return 具体实现
   */
  C values(Map<String, Object> value);

  /**
   * 批量插入的值集合
   *
   * @param values 值集合
   * @return 具体实现
   */
  C values(Collection<Map<String, Object>> values);

  /**
   * 插入冲突时
   *
   * @param constraintName 冲突的约束名称
   * @return 具体实现
   */
  C onConflict(String constraintName);

  /**
   * 冲突时啥也不干
   *
   * @return 具体实现
   */
  C doNothing();

  /**
   * 冲突时执行更新语句
   *
   * @return 冲突更新SQl
   */
  ConflictUpdateSql<C> doUpdate();

  /**
   * 冲突更新SQl
   *
   * @param <C> 具体实现类型
   */
  interface ConflictUpdateSql<C>
      extends Settable<ConflictUpdateSql<C>>, Completable<C>, SqlFragment {

    /**
     * 设置字段表达式
     *
     * @param field 字段名称
     * @param excludedField 冲突值中的字段名称
     * @return 具体实现
     */
    ConflictUpdateSql<C> setConflict(String field, String excludedField);

    /**
     * 设置字段表达式
     *
     * @param field 字段枚举
     * @param excludedField 冲突值中的字段名称
     * @return 具体实现
     */
    ConflictUpdateSql<C> setConflict(Enum<?> field, Enum<?> excludedField);
  }
}
